import pandas as pd
import xlwt
from pyecharts.charts import Map, Geo
from pyecharts.globals import ThemeType, GeoType, ChartType
from pyecharts import options as opts


# 绘制全国地图
def china():
    
    data = pd.read_excel('province.xls')  # 读取province.xls文件
    province = list(data['province'])  #将表格字段为province下的所有数据格式化为列表数据
    level = list(data['level'])
    list1 = [list(z) for z in zip(province, level)]  # 利用zip函数压缩数据格式为元组（a,b),然后再将每一个元组变成单独的列表，方便后面绘制地图

    map = Map(init_opts=opts.InitOpts(width="1500px", height="800px", theme=ThemeType.DARK))  #InitOpts初始化一些操作，设置宽度，高度，主题
    map.set_global_opts(

        # 标题配置项
        title_opts=opts.TitleOpts(
            title="研究院校A(1)/B(2)地域图",
            pos_left="center",  # 居中
            pos_top="top",  # 页面上方
            title_textstyle_opts=opts.TextStyleOpts(
                    font_size=30,  # 字体大小
                    color="rgba(255,255,255, 0.9)",  # 字体颜色和透明度
                ),
        ),

        # 图例配置项
        legend_opts=opts.LegendOpts(
            is_show=True,  # 显示图例
            pos_left="left",  # 位置为左上方
        ),

        # 视觉影射配置项
        visualmap_opts=opts.VisualMapOpts(
            min_=0,  # 组件最小值
            max_=2,  # 组件最大值
            range_text = ['等级程度分布颜色区间:', ''],  # 两端文本名称
            is_piecewise=True,  # 定义图例为分段型，默认为连续的图例
            pos_top= "middle",  # 组件离容器左侧的距离
            pos_left="left",
            orient="vertical",  # 布局方式为垂直布局，水平为horizon
            split_number=2  # 分成2个区间
        )
    )
    map.add("区域划分", list1, maptype="china", )  # 第一个参数为图表名称，第二个为传入的数据，第三个参数选择地图范围为全国，三个参数的位置不可以修改（如果使用变量赋值，位置随意）
    map.render("全国.html")  # 生成的地图名称，默认当前路径下，可以自定义位置


# 绘制各个省份的地图
def province():

    data1 = pd.read_excel('finally.xls')  # 打开最终生成的数据
    data2 = pd.read_excel("province.xls")  # 打开省份excel文件
    province = list(data2['province'])
    
    for i in province:  # 遍历省份列表
        # print(i)
        g = Geo(
            init_opts=opts.InitOpts(
                width="1600px",
                height="600px",
                bg_color="#CCCCCC",  # 背景颜色，自定义
                )
        )

        g.add_schema(maptype=i)  # i为省份名称，选择地图区域
        info = data1[data1.area==i]  # 筛选数据中字段为当前省份的行
        # print(info)
        name = list(info['name'])  # 大学名称列表
        jingdu = list(info['jingdu'])  # 经度列表
        weidu = list(info['weidu'])  # 维度列表
        ranking = list(info['ranking'])  # 省份大学排名
        data_pair = [list(z) for z in zip(name, ranking)]
        
        for j in range(len(name)):
            g.add_coordinate(name[j],jingdu[j],weidu[j])  # 循环添加自定义的坐标
        
        # 全局设置
        g.set_global_opts(

            # 设置标题
            title_opts=opts.TitleOpts(
                title="{}地图".format(i),  # 格式化生成省份标题
                pos_left="center",
                pos_top="top",
                title_textstyle_opts=opts.TextStyleOpts(
                    font_size=30,
                ),
                ),

            # 设置图例
            legend_opts=opts.LegendOpts(
            is_show=True,
            pos_left="left",
            ),
            )

        g.add(
            series_name='位置',  # 图例名称
            data_pair=data_pair, # 数据
            type_=GeoType.EFFECT_SCATTER,  # 图形选择
            symbol_size=14,
            itemstyle_opts=opts.ItemStyleOpts(
                color="#FF4040",
                ),
            label_opts=opts.LabelOpts(
                is_show=False, # 取消散点上数据显示
                font_size = 20,
                )
            )
        g.render("{}地图.html".format(i))  # i为province列表中省份名称


def main():
    # 选择需要调用的函数
    # china()  # 全国地图
    province()  # 省份地图


if __name__ == '__main__':  # 自己调用自己才可以运行
    main()